<?php
/**
 * Classe astratta per la gestione delle Entity.
 * Questa classe in base alla dichiarazione della Entity e' in grado di istanziare
 * tutta la struttura di quest'ultima a partire dal tipo di dato fino ad arrivare
 * alle regole per ogni colonna mappata sul database.
 *
 * @author Damiano Ciarla
 * @version 1.0
 * @category lib/entity
 */
abstract class Entity
{
	private $_vars = array();

	/**
	 * Metodo che riporta le caratteristiche di ogni colonna della tabella mappata sul Database
	 *
	 * @param String $varName		Nome della variabile es: $userId = 'userId'
	 * @param String $dbColumnName	Nome della colonna sul database
	 * @param String $type			Tipo di dato
	 * @param String $size			Eventuale lunghezza del campo
	 * @param Boolean $required		Valore booleano per identificare se il campo è obbligatorio o meno
	 */

	protected function _addColumnDescription($varName, $dbColumnName, $type, $size, $required)
	{
		$this->_vars[$varName] = array("DB_COLUMN" => $dbColumnName, "TYPE" => $type, "SIZE" => $size, "REQUIRED" => $required, "LABEL" => NULL, "RULES" => array());
	}

	/**
	 * Aggiunge una regole esplicitata nel costruttore della Entity
	 *
	 * @param string $varName	Nome della variabile a cui applicare la regola
	 * @param string $rule		Nome della regola
	 * @param string $value		Condizione della regola
	 */

	protected function _addRule($varName, $rule, $value = null)
	{
		include_once BXD_INCLUDEPATH . 'lib/entity/Rule.php';

		$this->_vars[$varName]["RULES"][] = new Rule($rule, $value);
	}

	/**
	 * Metodo che aggiunge la traduzione in lingua dell'etichetta di una colonna
	 * della Entity. Utilizzata nella stampa dei messaggi di ERRORE
	 *
	 * @param string $vars	Nome della variabile a cui applicare la regola
	 * @param string $label Etichetta da stampare nei messaggi di errore
	 */

	protected function _addTraductionLabel($vars, $label)
	{
		$this->_vars[$vars]["LABEL"] = $label;
	}

	/**
	 * Restituisce l'array delle variabili e regole inizializzate nel costruttore
	 *
	 * @return array Array delle variabili
	 */

	public function _getVars()
	{
		return $this->_vars;
	}

	/**
	 * Metodo che restituisce un array associativo con CHIAVE > DB_COLUMN e VALORE > Nome della variabile
	 *
	 * @return array Array con DB_COLUMN - Nome della variabile
	 */

	public function _getVarsFromColumn()
	{
		$newArray = array();

		foreach ($this->_vars as $key => $value)
			$newArray[$value["DB_COLUMN"]] = $key;

		return $newArray;
	}

	public function __get($name)
	{
		$methodName = "get" . ucfirst($name);

		if(method_exists($this, $methodName))
			return call_user_func_array(array($this, $methodName), array());
		else
			BXD::newException("EntityVarNotFound", "The variable " . $name . " is not defined in class " . get_class($this));

	}

	public function __set($name,  $value)
	{
		$methodName = "set" . ucfirst($name);

		if(method_exists($this, $methodName))
			return call_user_func_array(array($this, $methodName), array($value));
		else
			BXD::newException("EntityVarNotFound", "The variable " . $name . " is not defined in class " . get_class($this));
	}

	public abstract function getTableName();
}
?>
